#include<iostream>
#include<cstring>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;

void PrintPending()
{
    sigset_t pending;
    sigemptyset(&pending);
    sigpending(&pending);
    for(int i = 1; i <= 31; ++i)
    {
        if(sigismember(&pending, i))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void handler(int signo)
{
    cout << "get a signo: " << signo << endl;
    while(true)
    {
        PrintPending();
        sleep(1);
    }
}

int main()
{
    struct sigaction action;
    struct sigaction oaction;
    memset(&action, 0, sizeof(action));
    memset(&oaction, 0, sizeof(oaction));
    sigaddset(&action.sa_mask, 1);
    sigaddset(&action.sa_mask, 3);
    sigaddset(&action.sa_mask, 4);
    action.sa_handler = &handler;
    sigaction(2, &action, &oaction);
    while(true)
    {
        cout << "process " << getpid() << " is running" << endl;
        sleep(1);
    }

    return 0;
}




// volatile int flag = 0;      //防止CPU直接优化
// void handler(int signo)
// {
//     cout << "get a signo: " << signo << endl;
//     flag = 1;
//     cout << "flag is setted 1" << endl;
// }

// int main()
// {
//     signal(2, handler);
//     while(!flag);       //不要写函数体，否则不优化
//     // {
//     //     cout << "while is working" << endl;
//     //     sleep(1);
//     // }
//     cout << "while is quit" << endl;
//     return 0;
// }




// void handler(int signo)
// {
//     cout << "get a signo: " << signo << endl;
//     while(waitpid(-1, nullptr, WNOHANG) > 0)
//     {
//         cout << "wait a child process success"<< endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     cout << "father process: " << getpid() << " is running" << endl;
//     //signal(17, handler);
//     signal(17, SIG_IGN);
//     for(int i = 0; i < 10; ++i)
//     {
//         pid_t id = fork();
//         if(id == 0)
//         {
//             cout << "child process: " << getpid() << " is created" << endl;
//             sleep(5);
//             exit(1);
//         }
//         sleep(1);
//     }
//     while(true)
//     {
//         cout << "father work is over, now waiting" << endl;
//         sleep(1);
//     }
//     return 0;
// }